package Yahtzee;
import java.util.ArrayList;

public class Game
{
	private ArrayList<Dobbelsteen> 	dobbelstenen;
	private ArrayList<DobbelScore> 	dobbelscorelijst;
	private ArrayList<Player>	   	playerlijst;
	private int dobbels 			= 5;
	private int length  			= 0;
	private int turns   			= 0;
	private int playerNummer		= 1;
	
	public Game()
	{
		dobbelstenen 		= new ArrayList<Dobbelsteen>();
		dobbelscorelijst 	= new ArrayList<DobbelScore>();
		playerlijst 		= new ArrayList<Player>();
	}
	public void playGame()
	{
		if(playerlijst.isEmpty())
		{
			System.out.println("er zijn geen spelers!");
			return;
		}
		else
		{
			turns = 0;
			int counter = 0;
			while(counter < dobbels)
			{
				Dobbelsteen dobbelsteen = new Dobbelsteen(counter + 1, randomSteen());
				dobbelstenen.add(dobbelsteen);
				DobbelScore dobbelScore = new DobbelScore(counter + 1, 0);
				dobbelscorelijst.add(dobbelScore);
				counter++;
			}
			DobbelScore dobbelScore = new DobbelScore(counter + 1, 0);
			dobbelscorelijst.add(dobbelScore);
		}
	}
	public void addPlayer(String naam)
	{
		Player player = new Player(playerlijst.size() + 1, 0, naam);
		playerlijst.add(player);
	}
	public void deletePlayer(String naam)
	{
		for(Player player : playerlijst)
		{
			if(player.getNaam().equals(naam))
			{
				playerlijst.remove(this);
			}
			else
				System.out.println("no player exists");
		}
	}
	public void nieuweRonde(String veranderen)
	{
		if(turns < 3)
		{
			length = veranderen.length();
			int omzetten = Integer.parseInt(veranderen);
			int[] ditGaIkGebruiken = getGetallen(omzetten);
			int counter = 0;
			for(Dobbelsteen dobbelsteen : dobbelstenen)
			{
				if(counter == length)
				{
					turns = turns + 1;
					System.out.println("turns(inloop): "+turns);
					return;
				}
				else if(ditGaIkGebruiken[counter] == dobbelsteen.getDobbelNummer())
				{
					int nieuweDobbel = randomSteen();
					dobbelsteen.setWaarde(nieuweDobbel);
					System.out.println("counter: "+counter+", dobbelnummer: "+dobbelsteen.getDobbelNummer()+", nieuwe steen: "+nieuweDobbel);
					counter++;
				}
			}
			turns = turns + 1;
			System.out.println("turns(outloop): "+turns);
		}
		else if (turns >= 3)
		{
			endGame();
		}
	}
	public int[] getGetallen(int getallen)
	{
		int hulp = 1;
		int[] rijtje = new int[length];
		for(int i = (length - 1); i >= 0; i--)
		{
			rijtje[i] = getallen%(hulp * 10) / hulp;
			hulp = hulp * 10;
		}
		return rijtje;
	}
	public int randomSteen()
	{
		int i = (int) (Math.random() * 6)+ 1;
		return i;
	}
	public void printLijst()
	{
		for(Dobbelsteen dobbelsteen : dobbelstenen)
		{
			dobbelsteen.print();
		}
	}
	public void endGame()
	{
		int score = 0;
		boolean gedaan = false;
		berekenAantallen();
		for(DobbelScore dobbelScore : dobbelscorelijst)
		{
			if(fullHouse())
			{
				score = 40;
				gedaan = true;
			}
			else if(dobbelScore.getHoeveelheid() >= 3)
			{
				score = getTotaalVanDeVijf();
				score = (score + (dobbelScore.getHoeveelheid() * dobbelScore.getDobbelWaarde()));
				gedaan = true;
			}
			else if(bigStreet())
			{
				score = 50;
				gedaan = true;
			}
			else if(smallStreet())
			{
				score = 30;
				gedaan = true;
			}
			else if(!gedaan)
			{
				score = getTotaalVanDeVijf();
			}
		}
		addScore(score, playerNummer);
		printScore();
		nextPlayer();
	}
	public boolean smallStreet()
	{
		boolean street = false;
		int counter = 0;
		for(DobbelScore dobbelScore : dobbelscorelijst)
		{
			if(counter == 3)
			{
				street = true;
			}
			else if(dobbelScore.getHoeveelheid() >= 1)
			{
				counter++;
			}
			else if(dobbelScore.getHoeveelheid() == 0)
			{
				counter = 0;
			}
		}
		return street;
	}
	public boolean bigStreet()
	{
		boolean street = true;
		for(DobbelScore dobbelScore : dobbelscorelijst)
		{
			if(dobbelScore.getHoeveelheid() == 0)
			{
				street = false;
			}
		}
		return street;
	}
	public boolean fullHouse()
	{
		boolean fullHouse = false;
		boolean twee = false;
		boolean drie = false;
		for(DobbelScore dobbelScore : dobbelscorelijst)
		{
			if(dobbelScore.getHoeveelheid() == 2)
			{
				twee = true;
			}
			else if(dobbelScore.getHoeveelheid() == 3)
			{
				drie = true;
			}
		}
		if(twee && drie)
		{
			fullHouse = true;
		}
		return fullHouse;
	}
	public void addScore(int score, int playerNummer)
	{
		for(Player player : playerlijst)
		{
			if(player.getPlayerNummer() == playerNummer)
			{
				player.setScore(score);
			}
		}
	}
	public void berekenAantallen()
	{
		for(Dobbelsteen dobbelsteen : dobbelstenen)
		{
			setDobbelScore(dobbelsteen.getWaarde());
		}
	}
	public void setDobbelScore(int dobbelWaarde)
	{
		for(DobbelScore dobbelscore : dobbelscorelijst)
		{
			if(dobbelscore.getDobbelWaarde() == dobbelWaarde)
			{
				dobbelscore.setHoeveelheid(dobbelscore.getHoeveelheid() + 1);
			}
			dobbelscore.print();
		}
	}
	public void nextPlayer()
	{
		int spelers = playerlijst.size();
		if(playerNummer == spelers)
		{
			playerNummer = 1;
		}
		else
		{
			playerNummer = playerNummer + 1;
		}
	}
	public int getTotaalVanDeVijf()
	{
		int totaal = 0;
		for(Dobbelsteen dobbelsteen : dobbelstenen)
		{
			totaal = totaal + dobbelsteen.getWaarde();
		}
		return totaal;
	}
	public void printScore()
	{
		for(Player player : playerlijst)
		{
			player.printScore();
		}
	}
	public void printPlayers()
	{
		for(Player player : playerlijst)
		{
			player.print();
		}
	}
}
